package com.school.sports.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * 异常记录实体类
 * 用于记录系统运行过程中发生的异常信息
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("exception_record")
public class ExceptionRecord {

    @TableId(type = IdType.AUTO)
    private Long id;

    /**
     * 异常类型：业务异常、系统异常、参数异常、权限异常等
     */
    private String exceptionType;

    /**
     * 异常描述
     */
    private String exceptionDesc;

    /**
     * 发生时间
     */
    private LocalDateTime occurTime;

    /**
     * 发生地点（模块/功能）
     */
    private String occurLocation;

    /**
     * 异常级别：严重-1、中等-2、轻微-3
     */
    private Integer exceptionLevel;

    /**
     * 处理状态：0-待处理、1-处理中、2-已处理、3-已忽略
     */
    private Integer handleStatus;

    /**
     * 处理人ID
     */
    private Long handlerId;

    /**
     * 处理人姓名
     */
    private String handlerName;

    /**
     * 处理时间
     */
    private LocalDateTime handleTime;

    /**
     * 异常堆栈信息
     */
    private String stackTrace;

    /**
     * 解决方案
     */
    private String solution;

    /**
     * 相关操作
     */
    private String relatedOperation;

    /**
     * 请求参数
     */
    private String requestParams;

    /**
     * 请求URL
     */
    private String requestUrl;

    /**
     * 请求方法：GET、POST、PUT、DELETE等
     */
    private String requestMethod;

    /**
     * 用户IP地址
     */
    private String userIp;

    /**
     * 用户代理信息
     */
    private String userAgent;

    /**
     * 操作用户ID
     */
    private Long operatorId;

    /**
     * 操作用户名
     */
    private String operatorName;

    /**
     * 逻辑删除标记：0-未删除，1-已删除
     */
    @TableLogic
    private Integer deleted;

    /**
     * 创建时间
     */
    private LocalDateTime createdAt;

    /**
     * 更新时间
     */
    private LocalDateTime updatedAt;

    /**
     * 异常级别枚举
     */
    public enum Level {
        SEVERE(1, "严重"),
        MEDIUM(2, "中等"),
        SLIGHT(3, "轻微");

        private final Integer code;
        private final String desc;

        Level(Integer code, String desc) {
            this.code = code;
            this.desc = desc;
        }

        public Integer getCode() {
            return code;
        }

        public String getDesc() {
            return desc;
        }

        public static Level getByCode(Integer code) {
            for (Level level : values()) {
                if (level.getCode().equals(code)) {
                    return level;
                }
            }
            return MEDIUM; // 默认返回中等级别
        }
    }

    /**
     * 处理状态枚举
     */
    public enum Status {
        PENDING(0, "待处理"),
        PROCESSING(1, "处理中"),
        RESOLVED(2, "已处理"),
        IGNORED(3, "已忽略");

        private final Integer code;
        private final String desc;

        Status(Integer code, String desc) {
            this.code = code;
            this.desc = desc;
        }

        public Integer getCode() {
            return code;
        }

        public String getDesc() {
            return desc;
        }

        public static Status getByCode(Integer code) {
            for (Status status : values()) {
                if (status.getCode().equals(code)) {
                    return status;
                }
            }
            return PENDING; // 默认返回待处理状态
        }
    }

    /**
     * 获取异常级别描述
     */
    public String getExceptionLevelDesc() {
        return Level.getByCode(this.exceptionLevel).getDesc();
    }

    /**
     * 获取处理状态描述
     */
    public String getHandleStatusDesc() {
        return Status.getByCode(this.handleStatus).getDesc();
    }
}